package com.tbit.uqbike.webmanager.dao.core;

import com.tbit.uqbike.object.pojo.*;
import com.tbit.uqbike.object.pojo.statistics.MonthDateType;
import com.tbit.uqbike.object.pojo.statistics.RideOrderDaySta;
import com.tbit.uqbike.object.pojo.vo.CurrentBattery;
import com.tbit.uqbike.object.pojo.vo.DeptPayVO;
import com.tbit.uqbike.webmanager.business.ridelog.object.dto.RideLogCount;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;

import java.util.*;

public interface RideLogDao {

    RideLogEx findLastByMachineId(Integer machineId);

    int insert(RideLog record);

    int insertSelective(RideLog record);

    /**
     * 更新
     *
     * @param rideLog
     */
    void update(RideLog rideLog);

    /**
     * 查询总数
     *
     * @param params
     * @return
     */
    Integer queryCount(Map<String, Object> params);

    /**
     * 分页查询
     *
     * @param params
     * @return
     */
    List<RideLog> queryPage(Map<String, Object> params);

    /**
     * 修改支付时间
     *
     * @param rideLog
     */
    void updatePayTime(RideLog rideLog);

    RideLog getByOrderNO(String orderNO);

    /**
     * 借出站点统计
     */
    List<StatPark> statByStartPark(Map<String, Object> params);

    /**
     * 借出站点统计总数
     */
    Integer statByStartParkCount(Map<String, Object> params);

    /**
     * 借出站点分区统计
     */
    List<StatPark> statByStartParkAndRegionId(Map<String, Object> params);

    /**
     * 借出站点分区统计总数
     */
    List<StatPark> statByStartParkCountAndRegionId(Map<String, Object> params);

    /**
     * 归还站点统计
     */
    List<StatPark> statByEndPark(Map<String, Object> params);

    /**
     * 归还站点分区统计
     */
    List<StatPark> statByEndParkAndRegionId(Map<String, Object> params);

    /**
     * 归还站点统计总数
     */
    Integer statByEndParkCount(Map<String, Object> params);

    /**
     * 归还站点统计分区总数
     */
    List<StatPark> statByEndParkCountAndRegionId(Map<String, Object> params);

    /**
     * 订单按天统计
     */
    StatPark statRecharge(Map<String, Object> params);

    /**
     * 订单按天统计折线图数据
     */
    List<StatPark> statLineChart(Map<String, Object> params);

    /**
     * 根据设备id查询骑行订单
     */
    List<MachineRideLog> getByMachineId(Map<String, Object> params);

    /**
     * 通过userId查询订单记录
     *
     * @param userId  用户id
     * @param orderNo 订单号
     */
    List<MachineRideLog> getByUserId(@Param("userId") Integer userId, @Param("orderNo") String orderNo,
                                     @Param("accountIdList") List<Integer> accountIdList);

    /**
     * 总数
     */
    Integer getByMachineIdCount(Map<String, Object> params);

    /**
     * 订单查询详细分页
     */
    List<RideLog> rechargeQueryPage(Map<String, Object> params);

    /**
     * 订单查询总数
     */
    Integer rechargeQueryCount(Map<String, Object> params);

    /**
     * 订单导出数据
     */
    List<RideLog> rechargeQueryExport(Map<String, Object> params);

    /**
     * 骑行订单金额统计
     */
    Integer getRideMoneyByTime(Map<String, Object> params);

    /**
     * 骑行订单按天统计或按月统计
     */
    List<StatPark> statByType(Map<String, Object> params);

    /**
     * 骑行订单总览统计
     */
    List<StatPark> statByAccount(Map<String, Object> params);

    /**
     * 按代理分组，统计时间段内订单总数及总金额
     */
    List<MoneyData> groupByAccountId(Map<String, Object> params);

    /**
     * 统计订单总收入
     */
    MoneyData statMoney(Map<String, Object> params);

    /**
     * 根据订单类型统计订单收入
     */
    MoneyData statMoneyByPayType(Map<String, Object> params);

    /**
     * 统计分区订单总收入
     */
    MoneyData statMoneyByRegion(Map<String, Object> params);

    /**
     * 根据分区id统计订单总收入
     */
    MoneyData statMoneyByRegionId(Map<String, Object> params);

    /**
     * 订单查询详细分页
     */
    List<RideLog> userPage(Map<String, Object> params);

    /**
     * 订单查询详细总数
     */
    Integer userCount(Map<String, Object> params);

    /**
     * 订单查询详细导出
     */
    List<RideLog> userExport(Map<String, Object> params);

    /**
     * 骑行订单排行榜
     */
    List<Map<String, Object>> selectRideRank(RideLog rideLog);

    /**
     * 统计前一天的运营区骑行订单
     */
    Map<String, Object> statYesterdayOrder(Map<String, Object> params);

    /**
     * 统计前一天的运营区骑行订单
     */
    List<Map<String, Object>> selectLog(Map<String, Object> params);


    /**
     * 统计前一天的分区骑行订单
     */
    Map<String, Object> statYesterdayOrderByRegionId(Map<String, Object> params);

    /**
     * 按天统计
     */
    List<Map<String, Object>> statByDay(Map<String, Object> params);

    /**
     * 每个分区按天统计
     */
    List<Map<String, Object>> statByDayAndRegionId(Map<String, Object> params);

    /**
     * 按天统计
     *
     * @param params 参数个数
     * @return {@link List}<{@link RideOrderDaySta}>
     */
    RideOrderDaySta selectDateByMap(Map<String, Object> params);

    /**
     * 更新订单金额
     */
    void updateRidelog(RideLog rideLog);

    /**
     * 统计用户欠款详情
     */
    List<Map<String, Object>> arrearsStatistics(RideLog rideLog);

    List<Map<String, Object>> statOrderByPark(HashMap<String, Object> params);

    RideLog getLastByUserId(Integer userId);

    Integer getByPayTimeAndUserId(@Param("userId") Integer userId, @Param("payTime") String payTime);


    NameCount getRideByRidelog(Map<String, Object> map);

    /**
     * 获取品牌的欠款记录
     */
    MoneyData getDebtTotal(Map<String, Object> map);

    /**
     * 获取品牌的欠款补交统计
     */
    MoneyData getDebtPayTotal(Map<String, Object> map);

    /**
     * 获取区域的欠款补交订单的日期和金额
     */
    List<DeptPayVO> getDebtPayPage(Map<String, Object> map);

    /**
     * 根据时间分组，获取时间内的车辆数量
     */
    List<Map<String, Object>> getMachineNumDay(Map<String, Object> map);

    /**
     * 获取时间段内的车辆数量
     */
    Map<String, Object> getYesterdayMachineNum(Map<String, Object> map);

    /**
     * 根据开始时间和车辆编号获取骑行的车辆数
     */
    Integer getRidingMachine(Map<String, Object> map);

    /**
     * 根据支付和结束时间分组获取骑行订单数据
     *
     * @param map 地图
     * @return {@link List}<{@link MonthDateType}>
     */
    List<MonthDateType> getGroupDate(Map<String, Object> map);

    /**
     * 查询骑行订单数据
     *
     * @param param 参数
     * @return {@link List}<{@link RideLog}>
     */
    List<RideLog> selectRideLog(Map<String, Object> param);

    /**
     * 查询用户最近一条订单
     *
     * @param userId
     * @return
     */
    RideLog queryLatestRideLog(@Param("userId") Integer userId);

    /**
     * 更新订单信息
     *
     * @param orderNO
     * @param newRideLogMoney
     * @param rideLogRemark
     * @param isPay
     * @param now
     */
    void updateRideLogByOrderNO(@Param("orderNO") String orderNO, @Param("newRideLogMoney") Long newRideLogMoney, @Param("rideLogRemark") String rideLogRemark, @Param("isPay") boolean isPay, @Param("now") Date now);


    List<RideLog> getListByOrderNOs(List<String> orderNOs);

    double getCurrentMileage(CurrentBattery currentBattery);

    double getPreviousMileage(CurrentBattery currentBattery);

    /**
     * 获取包含订单车辆数
     *
     * @param startTime  开始时间
     * @param endTime    结束时间
     * @param accountIds 区域id
     * @param regionIds  分区id
     * @return map
     */
    @MapKey("k")
    Map<String, Map<String, Object>> getHasOrder(@Param("startTime") String startTime, @Param("endTime") String endTime, @Param("accountIds") List<Integer> accountIds, @Param("regionIds") List<Integer> regionIds, @Param("type") Integer type);

    /**
     * 订单车辆数
     *
     * @param accountId 区域id
     * @param start     开始时间
     * @param end       结束时间
     * @return map
     */

    List<MachineGroup> getHasOrderByAccount(@Param("accountId") Integer accountId, @Param("start") Date start, @Param("end") Date end);

    List<MachineGroup> getHasOrderByRegion(@Param("accountId") Integer accountId, @Param("start") Date start, @Param("end") Date end, @Param("regionId") Set<Integer> regionId);

    /**
     * 根据车辆编号查询最近骑行用户
     *
     * @param machineId 设备id
     * @param accountId 运营区域id
     * @param pageNO    页码
     * @param rowCount  条数
     * @return List<RideLog>
     */
    List<RideLog> getRecentUserByUserCode(@Param("machineId") Integer machineId, @Param("accountId") Integer accountId,
                                          @Param("pageNO") Integer pageNO, @Param("rowCount") Integer rowCount);

    List<RideLogCount> selectTotalCountByAccountIdAndDate(@Param("accountIds") List<Integer> accountIds, @Param("startTime") Date startTime, @Param("endTime") Date endTime);


    int addBatch(@Param("list") List<RideLog> list);

    int deleteByOrderNos(@Param("orderNos") List<String> orderNos);

    /**
     * 根据区域筛选用户最近一笔订单
     *
     * @param userId        用户id
     * @param accountIdList 区域id集合
     */
    RideLog getLastByUserIdAndAccountId(@Param("userId") Integer userId, @Param("accountIdList") List<Integer> accountIdList);

    /**
     * 根据用户id获取用户订单数量
     *
     * @param userId 用户id
     */
    Integer selectRideLogCountByUserId(@Param("userId") Integer userId);
}